package com.dys.testqueue16;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @className: com.dys.testqueue16.LinkedBlockingQueueTest
 * @description: com.dys.testqueue16
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/12 下午10:01
 */
public class LinkedBlockingQueueTest {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) {
        new LinkedBlockingQueueTest().testAddElement();
    }

    /**
     * 添加元素
     */
    public void testAddElement() {
        // 创建一个队列，队列可以指定容量长度
        LinkedBlockingQueue<Integer> abq = new LinkedBlockingQueue<Integer>(3);
        // 添加元素：
        // [1] 添加null元素：不可以添加null元素,会抛空指针异常
        // abq.add(null);
        // abq.offer(null);
        //  try {
        //      abq.put(null);
        //  } catch (InterruptedException e) {
        //      throw new RuntimeException(e);
        //  }
        // [2]正常添加元素
        // abq.add(1);
        try {
            abq.put(2);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        abq.add(2);
        abq.add(3);
        System.out.println(abq);
        // [3]在队列满的情况下添加元素
        // 在队列满的情况下，添加元素 出现异常：Queue full
        // abq.add(4);
        // 没有添加成功，返回false
        // System.out.println(abq.offer(4));
        // try {
        // 设置最大阻塞时间，如果时间到了，队列还是满的，就不再阻塞了
        //     abq.offer(4,3, TimeUnit.SECONDS);
        // } catch (InterruptedException e) {
        //     throw new RuntimeException(e);
        // }
        // try {
        //     // 真正的阻塞方法，如果队列满，就永远阻塞
        //     abq.put(4);
        // } catch (InterruptedException e) {
        //     throw new RuntimeException(e);
        // }
    }

    /**
     * 获取元素
     */
    public void getQueueElement() {
        LinkedBlockingQueue<String> abq = new LinkedBlockingQueue<>(3);
        abq.add("AAA");
        abq.add("BBB");
        abq.add("CCC");
        // 1.得到头元素,但是不移除
        System.out.println("获取头元素不移除：" + abq.peek());
        System.out.println(abq);
        System.out.println("获取头元素移除：" + abq.poll());
        System.out.println(abq);
        // 阻塞方法
        try {
            System.out.println("获取头元素并移除：" + abq.take());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(abq);

        // 清空元素
        abq.clear();
        System.out.println(abq);
        System.out.println("获取头元素不移除：" + abq.peek());
        System.out.println("获取头元素移除：" + abq.poll());
        try {
            System.out.println(abq.poll(2, TimeUnit.SECONDS));
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        // try {
        //     // 真正阻塞：队列为空，永远阻塞
        //     System.out.println("获取头元素并移除：" + abq.take());
        // } catch (InterruptedException e) {
        //     throw new RuntimeException(e);
        // }
    }
}
